package Bridge

import "fmt"

/**
- [结构型_桥接模式](http://c.biancheng.net/view/1364.html)
- 定义：将抽象与实现分离，使它们可以独立变化
- 结构组成：
	1. 抽象化（Abstraction）角色：定义抽象类，并包含一个对实现化对象的引用。
	2. 扩展抽象化（Refined Abstraction）角色：是抽象化角色的子类，实现父类中的业务方法，并通过组合关系调用实现化角色中的业务方法。
	3. 实现化（Implementor）角色：定义实现化角色的接口，供扩展抽象化角色调用。
	4. 具体实现化（Concrete Implementor）角色：给出实现化角色接口的具体实现。

- 例，画的图形的形状(shape)与具体尺寸分离
*/

type Draw interface {
	DrawCircle(radius, x, y int)
}

// shape1
type RedCircle struct {
}

func (red *RedCircle) DrawCircle(radius, x, y int) {
	fmt.Printf("it is red circle...radius:%d x:%d y:%d \n", radius, x, y)
}

// shape2
type YellowCircle struct {
}

func (yellow *YellowCircle) DrawCircle(radius, x, y int) {
	fmt.Printf("it is yellow circle...radius:%d x:%d y:%d \n", radius, x, y)
}

type Shape struct {
	draw Draw
}

func (s *Shape) Shape(d Draw) {
	s.draw = d
}

type Circle struct {
	shape        Shape // 形状
	x, y, radius int   // 尺寸
}

func (c *Circle) Constructor(x, y, radius int, draw Draw) {
	c.x = x
	c.y = y
	c.radius = radius
	c.shape.Shape(draw)
}
func (c *Circle) Draw() {
	c.shape.draw.DrawCircle(c.radius, c.x, c.y)
}
